const fp = require("fastify-plugin");
const op = require("sequelize").Op;

//重要：这是一个fastify的插件
module.exports = fp(async function (fastify, options) {
  //注册至名称：cardService
  fastify.decorate("cardService", function () {
    //之前将card的model以“card”注册在了fastify，现在就可以fastify.card()获取到model实例
    const cardModel = fastify.card();
    //引用fastify自己封装的log
    const log = fastify.log;
    //从options中拿出封装在其中的logLevel
    log.level = options.logLevel;

    //查
    async function findById(id) {
      log.info("into card-plugin: findById：%s", id);
      //Model自己封装的方法之一(根据主键查数据)
      return cardModel.findByPk(id);
    }

    //自定义查
    async function findByMemberId(memberId) {
      log.info("into card-plugin: findByMemberId: %s", memberId);
      return cardModel.findAndCountAll({
        where: {
          [op.and]: {
            memberId: memberId,
          },
        },
      });
    }

    //查全
    async function findAll() {
      log.info("into card-plugin: findAll");
      //Model自己封装的方法之一
      return cardModel.findAll();
    }

    //增
    async function insert(params) {
      log.info("into card-plugin: insert");
      const newCard = cardModel.build(params);
      log.info(
        "newCard is instanceof cardModel? %s",
        newCard instanceof cardModel
      );
      log.info("newCard data: %s", JSON.stringify(newCard.toJSON()));
      //上面是为了打log用,嫌上面麻烦就直接使用create吧
      //return cardModel.create(params);
      //返回保存到数据库了的数据
      return newCard.save();
    }

    //改,改的话比较麻烦，得先查再改
    async function update(params) {
      log.info("into card-plugin: update");

      if (params.id != null && params.id != undefined) {
        return cardModel.findByPk(params.id).then((obj) => {
          try {
            return obj.update(params);
          } catch (error) {
            log.error(error);
            return null;
          }
        });
      } else throw new ReferenceError("id不存在！");
    }

    //删
    async function destroy(id) {
      log.info("into card-plugin: destroy: %s", id);
      //删除也比较麻烦，也得先查再删
      if (id) {
        return cardModel.findByPk(id).then((obj) => {
          if (obj) return obj.destroy();
        });
      } else throw new ReferenceError("id不存在！");
    }

    //重要的一步：选择要暴露的方法
    //（我觉得findAll()很危险所以不暴露。jpg）
    return {
      findById,
      findByMemberId,
      insert,
      update,
      destroy,
    };
  });
});
